package com.yangyang.androidconnect.util;

import android.content.Context;
import java.io.File;

/**
 * 应用内部缓存目录工具类
 */
public class InternalCacheDirUtil {

    private final Context context;

    public InternalCacheDirUtil(Context context) {
        this.context = context.getApplicationContext();
    }

    /**
     * 获取内部缓存目录的File对象
     */
    public File getCacheDir() {
        return context.getCacheDir();
    }

    /**
     * 获取内部缓存目录的绝对路径
     */
    public String getCachePath() {
        return getCacheDir().getAbsolutePath();
    }

    /**
     * 获取指定子目录的File对象
     * @param subDirName 子目录名称
     */
    public File getSubCacheDir(String subDirName) {
        File subDir = new File(getCacheDir(), subDirName);
        if (!subDir.exists()) {
            subDir.mkdirs();
        }
        return subDir;
    }

    /**
     * 获取指定子目录的绝对路径
     * @param subDirName 子目录名称
     */
    public String getSubCachePath(String subDirName) {
        return getSubCacheDir(subDirName).getAbsolutePath();
    }

    /**
     * 计算当前缓存大小（字节）
     */
    public long calculateCacheSize() {
        return calculateFileSize(getCacheDir());
    }

    /**
     * 清除所有内部缓存
     */
    public boolean clearAllCache() {
        return deleteFilesInDir(getCacheDir());
    }

    /**
     * 清除指定子目录的缓存
     * @param subDirName 子目录名称
     */
    public boolean clearSubCache(String subDirName) {
        return deleteFilesInDir(getSubCacheDir(subDirName));
    }

    // 递归计算目录大小
    private long calculateFileSize(File file) {
        long size = 0;
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            if (files != null) {
                for (File f : files) {
                    size += calculateFileSize(f);
                }
            }
        } else {
            size = file.length();
        }
        return size;
    }

    // 递归删除目录中的文件
    private boolean deleteFilesInDir(File dir) {
        if (dir == null || !dir.exists()) {
            return false;
        }

        boolean success = true;
        if (dir.isDirectory()) {
            File[] files = dir.listFiles();
            if (files != null) {
                for (File file : files) {
                    if (file.isDirectory()) {
                        success &= deleteFilesInDir(file);
                    } else {
                        success &= file.delete();
                    }
                }
            }
        }
        return success;
    }
}